﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Diagnostics;
using System.IO;

namespace Rebides
{
    /// <summary>
    /// Descrição: Classe para afetuar as estatisticas
    /// Autor: Luís Costa Nº 6032
    /// </summary>
    class Statistics
    {
        private DataBase db = new DataBase();

        /// <summary>
        /// Processa a estatistica dos docentes por categoria,
        /// estabelecimento e ano.
        /// </summary>
        internal void stat_doc_cat_estab_ano()
        {
            //Vai à base de dados buscar os dados
            //--------------------------------------
            DataSet dsFichas_Docencia = db.loadData("SELECT * FROM Fichas_Docencia", "Fichas_Docencia");
            DataSet dsCategorias = db.loadData("SELECT * FROM Categorias", "Categorias");
            DataSet dsEstabelecimentos = db.loadData("SELECT * FROM Estabelecimentos", "Estabelecimentos");

            DataTable fichasDocencia = dsFichas_Docencia.Tables["Fichas_Docencia"];
            DataTable categorias = dsCategorias.Tables["Categorias"];
            DataTable estabs = dsEstabelecimentos.Tables["Estabelecimentos"];

            //Faz a estatistica através do LINQ
            var stat = from ficha in fichasDocencia.AsEnumerable()
                       join categoria in categorias.AsEnumerable()
                           on ficha.Field<Int64>("Cod_Categoria") equals categoria.Field<Int64>("Cod_Categoria")
                       join estab in estabs.AsEnumerable()
                           on ficha.Field<Int64>("Cod_Estabelecimento") equals estab.Field<Int64>("Cod_Estabelecimento")
                       orderby categoria.Field<string>("Designacao"), estab.Field<string>("Designacao"), ficha.Field<Int64>("Ano")

                       group ficha by new
                       {
                           Categoria = categoria.Field<string>("Designacao"),
                           Estabelecimento = estab.Field<string>("Designacao"),
                           Ano = ficha.Field<Int64>("Ano")
                       }
                           into dadosGroup
                           select new
                           {
                               x = dadosGroup.Key,
                               y = dadosGroup.Count()
                           };

            //Escreve a estatistica num ficheiro
            //-----------------
            //Abre o ficheiro para escrita
            TextWriter tw = new StreamWriter("stat1.txt");

            //Escreve o titulo
            tw.WriteLine("Listagem de docentes por Categoria, Estabelecimento e Ano");
            tw.WriteLine("############################################");
            tw.WriteLine("");

            //Escreve os dados da estatistica
            //-------------------
            foreach (var ficha in stat)
            {
                tw.WriteLine(ficha.x + " ---- TOTAL: " + ficha.y);
            }
            // close the stream
            tw.Close();
        }

        /// <summary>
        /// Processa a estatistica dos docentes por tipo de grau,
        /// estabelecimento e ano.
        /// </summary>
        internal void stat_tipo_grau_estab_ano()
        {
            //Vai à base de dados buscar os dados
            //--------------------------------------
            DataSet dsFichas_Docencia = db.loadData("SELECT * FROM Fichas_Docencia", "Fichas_Docencia");
            DataSet dsGraus = db.loadData("SELECT * FROM Graus", "Graus");
            DataSet dsTiposGraus = db.loadData("SELECT * FROM Tipos_Graus", "Tipos_Graus");
            DataSet dsEstabelecimentos = db.loadData("SELECT * FROM Estabelecimentos", "Estabelecimentos");

            DataTable fichasDocencia = dsFichas_Docencia.Tables["Fichas_Docencia"];
            DataTable graus = dsGraus.Tables["Graus"];
            DataTable tiposGraus = dsTiposGraus.Tables["Tipos_Graus"];
            DataTable estabs = dsEstabelecimentos.Tables["Estabelecimentos"];

            //Faz a estatistica através do LINQ
            var stat = from ficha in fichasDocencia.AsEnumerable()
                       join grau in graus.AsEnumerable()
                           on ficha.Field<Int64>("Cod_Grau") equals grau.Field<Int64>("Cod_Grau")
                       join tipo_grau in tiposGraus.AsEnumerable()
                         on grau.Field<Int64>("Cod_Tipo_Grau") equals tipo_grau.Field<Int64>("Cod_Tipo_Grau")
                       join estab in estabs.AsEnumerable()
                           on ficha.Field<Int64>("Cod_Estabelecimento") equals estab.Field<Int64>("Cod_Estabelecimento")
                       orderby tipo_grau.Field<string>("Designacao"), estab.Field<string>("Designacao"), ficha.Field<Int64>("Ano")
                       group ficha by new
                       {
                           Tipo_Grau = tipo_grau.Field<string>("Designacao"),
                           Estabelecimento = estab.Field<string>("Designacao"),
                           Ano = ficha.Field<Int64>("Ano")
                       }
                           into dadosGroup
                           
                           select new
                           {
                               x = dadosGroup.Key,
                               y = dadosGroup.Count()
                           };

            //Escreve a estatistica num ficheiro
            //-----------------
            //Abre o ficheiro para escrita
            TextWriter tw = new StreamWriter("stat2.txt");

            //Escreve o titulo
            tw.WriteLine("Listagem de docentes por Tipo de Grau, Estabelecimento e Ano");
            tw.WriteLine("############################################");
            tw.WriteLine("");

            //Escreve os dados da estatistica
            //-------------------
            foreach (var ficha in stat)
            {
                tw.WriteLine(ficha.x + " ---- TOTAL: " + ficha.y);
            }
            // close the stream
            tw.Close();

        }

        
        private void writeToFile(IEnumerable<DataRow> stat, string title, string fileName)
        {
            
 	       
        }
    }

    //private class Categoria
    //{
    //    public int Cod_Categoria { get; set; }
    //    public string Designacao { get; set; }
    //}

    //private class Estabelecimento
    //{
    //    public int Cod_Estabelecimento { get; set; }
    //    public string Designacao { get; set; }
    //}

    //private class Fichas_Docencia
    //{
    //    public int Ano { get; set; }
    //    public int Cod_Docente { get; set; }
    //    public int cod_Estabelecimento { get; set; }
    //    public int Cod_Categoria { get; set; }
    //}
}
